package com.example.mq.common;

import com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;

import java.io.*;

/**

 * 序列化 和 反序列化 工具类
 */
public class BinaryTool {

    //把一个对象序列化成字节数组
    public static byte[] toBytes(Object object) throws IOException {
        //使用 try 自动关闭字节流
        try(ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()){
            try(ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)){
                // 使用 writeObject 将对象序列化,生成的二进制字节数据 就会写入到
                // ObjectOutputStream
                // ObjectOutputStream 又与 ByteArrayOutputStream 进行关联,于是二进制字节数据就会写入 ByteArrayOutputStream 中
                objectOutputStream.writeObject(object);
            }
            //从ByteArrayOutputStream 中持有的二进制字节数据取出 转换成字节数组
            return byteArrayOutputStream.toByteArray();
        }
    }

    //把一个字节数组 反序列化成 一个对象
    public static Object toObject(byte[] data) throws IOException, ClassNotFoundException {
        Object object = null;
        try(ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(data)){
            try(ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
                // byteArrayInputStream 将字节数组的数据进行读取
                // objectInputStream 又跟 byteArrayInputStream 关联,获取到字节数组的二进制数据。
                // readObject 反序列化成 Object 对象
                object = objectInputStream.readObject();
            }
        }
        return object;
    }

}
